// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
es6id: 25.4.4.1.2
description: The `length` property of Promise.all Resolve Element functions
info: |
  The length property of a Promise.all resolve element function is 1.

  17 ECMAScript Standard Built-in Objects:
    Unless otherwise specified, the length property of a built-in Function
    object has the attributes { [[Writable]]: false, [[Enumerable]]: false,
includes: [propertyHelper.js]
---*/

function Test() {
    var resolveElementFunction;
    var thenable = {
      then: function(fulfill) {
        resolveElementFunction = fulfill;
      }
    };

    function NotPromise(executor) {
      executor(function() {}, function() {});
    }
    NotPromise.resolve = function(v) {
      return v;
    };
    Promise.all.call(NotPromise, [thenable]);

    assert.sameValue(resolveElementFunction.length, 1);

    verifyNotEnumerable(resolveElementFunction, "length");
    verifyNotWritable(resolveElementFunction, "length");
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
